package com.lxl.model;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.util.ArrayList;

/**
 * 大子弹类
 * 
 * @author 刘星鹭
 * @Email liuxinglumail@163.com
 * @version 创建时间： 2014年11月10日 下午8:50:25
 */
public class BigBullet {
	/**
	 * 子弹直径
	 */
	public static int BULLET_DIAMETER = 200;
	/**
	 * 子弹颜色
	 */
	public static Color BULLET_COLOR = Color.BLUE;
	/**
	 * 子弹速度
	 */
	public static int BULLET_SPEED = 1;
	/**
	 * 子弹方向
	 */
	private Direction bulletDirection = Direction.STOP;
	/**
	 * 子弹左上角横坐标
	 */
	private int bulletX = 0;
	/**
	 * 子弹左上角纵坐标
	 */
	private int bulletY = 0;
	/**
	 * 子弹所在弹夹
	 */
	private ArrayList<BigBullet> thisBigBullets = new ArrayList<BigBullet>();
	/**
	 * 子弹是否存活
	 */
	private boolean alive = false;

	/**
	 * 无参构造方法
	 */
	public BigBullet() {

	}

	/**
	 * 带参构造方法
	 * 
	 * @param bulletDirection
	 *            子弹方向
	 * @param bulletX
	 *            子弹横坐标
	 * @param bulletY
	 *            子弹纵坐标
	 */
	public BigBullet(Direction bulletDirection, int bulletX, int bulletY) {
		this.bulletDirection = bulletDirection;
		this.bulletX = bulletX;
		this.bulletY = bulletY;
		alive = true;
	}

	/**
	 * 画子弹方法
	 * 
	 * @param graphics
	 *            画笔
	 */
	public void paint(Graphics graphics) {
		// 如果死了就return
		if (!alive)
			return;
		// 移动子弹
		move();
		// 储存当前画笔颜色
		Color backGroundColor = graphics.getColor();
		// 改变当前画笔颜色为子弹颜色
		graphics.setColor(BULLET_COLOR);
		// 画出子弹
		graphics.fillOval(bulletX, bulletY, BULLET_DIAMETER, BULLET_DIAMETER);
		// 还原当前画笔颜色
		graphics.setColor(backGroundColor);
	}

	/**
	 * 移动子弹方法
	 */
	private void move() {
		// 如果死了就return
		if (!alive)
			return;
		// 上
		if (bulletDirection == Direction.UP) {
			bulletY -= BULLET_SPEED;
		}
		// 下
		else if (bulletDirection == Direction.DOWN) {
			bulletY += BULLET_SPEED;
		}
		// 左
		else if (bulletDirection == Direction.LEFT) {
			bulletX -= BULLET_SPEED;
		}
		// 右
		else if (bulletDirection == Direction.RIGHT) {
			bulletX += BULLET_SPEED;
		}
		// 上左
		else if (bulletDirection == Direction.UP_LEFT) {
			bulletX -= BULLET_SPEED * 0.7;
			bulletY -= BULLET_SPEED * 0.7;
		}
		// 上右
		else if (bulletDirection == Direction.UP_RIGHT) {
			bulletX += BULLET_SPEED * 0.7;
			bulletY -= BULLET_SPEED * 0.7;
		}
		// 下左
		else if (bulletDirection == Direction.DOWN_LEFT) {
			bulletX -= BULLET_SPEED * 0.7;
			bulletY += BULLET_SPEED * 0.7;
		}
		// 下右
		else if (bulletDirection == Direction.DOWN_RIGHT) {
			bulletX += BULLET_SPEED * 0.7;
			bulletY += BULLET_SPEED * 0.7;
		}
		// 如果子弹出界
		if (bulletX < 0 - BULLET_DIAMETER || bulletX > 800 + BULLET_DIAMETER) {
			// 使其死去
			alive = false;
			thisBigBullets.remove(this);
		} else if (bulletY < 0 - BULLET_DIAMETER
				|| bulletY > 600 + BULLET_DIAMETER) {
			// 使其死去
			alive = false;
			thisBigBullets.remove(this);
		}
	}

	/**
	 * 判断子弹是否击中坦克或子弹
	 * 
	 * @param enemyTanks
	 *            敌军坦克ArrayList
	 */
	public void hit(ArrayList<EnemyTank> enemyTanks) {
		// 如果死了就return
		if (!alive)
			return;
		// 判断坦克
		for (int i = 0; i < enemyTanks.size(); i++) {
			// 如果是死坦克就跳过
			if (!enemyTanks.get(i).isAlive())
				continue;
			// 如果碰撞坦克了就把坦克设为死亡
			if (enemyTanks.get(i).getSurroundRectangle()
					.intersects(getSurroundRectangle())) {
				enemyTanks.get(i).setAlive(false);
			}
			// 判断子弹
			for (int j = 0; j < enemyTanks.get(i).getThisBullets().size(); j++) {
				// 如果是死子弹就跳过
				if (!enemyTanks.get(i).getThisBullets().get(j).isAlive())
					continue;
				// 如果碰撞子弹了就把敌方子弹设为死亡
				if (enemyTanks.get(i).getThisBullets().get(j)
						.getSurroundRectangle()
						.intersects(getSurroundRectangle())) {
					enemyTanks.get(i).getThisBullets().get(j).setAlive(false);
				}
			}
		}
	}

	/**
	 * 判断子弹是否击中墙
	 * 
	 * @param wall
	 *            欲判断的墙
	 */
	public void hitWall(Wall wall) {
		// 如果死了就return
		if (!alive)
			return;
		// 如果击中了墙
		if (getSurroundRectangle().intersects(wall.getSurroundRectangle())) {
			thisBigBullets.remove(this);
			alive = false;
		}
	}

	/**
	 * 获得围绕当前圆形的矩形
	 * 
	 * @return 围绕当前圆形的矩形
	 */
	public Rectangle getSurroundRectangle() {
		return new Rectangle(bulletX, bulletY, BULLET_DIAMETER, BULLET_DIAMETER);
	}

	/**
	 * alive的setter
	 * 
	 * @param alive
	 *            是否存活
	 */
	public void setAlive(boolean alive) {
		this.alive = alive;
	}
	/**
	 * alive的getter
	 * 
	 * @return true为存活
	 */
	public boolean isAlive() {
		return alive;
	}

	/**
	 * thisBullets的setter
	 * 
	 * @param thisBigBullets
	 *            当前大子弹所属大弹夹
	 */
	public void setThisBigBullets(ArrayList<BigBullet> thisBigBullets) {
		this.thisBigBullets = thisBigBullets;
	}
}
